package com.igd.business.dao;

import java.sql.SQLException;
import java.util.List;

import com.igd.common.client.IbatisCallBack;
import com.igd.exceptions.IgdException;
import com.igd.pojo.vo.PageList;

/**
 * @createDate 2013-6-16
 *
 * @author QIAOYU
 *
 * @version 1.0
 *
 * @description 公用DAO方法接口
 */

public interface IBaseDao {

	/**
	 * 获取数据库主键方法,如果是oracle数据库则传入senquence语句获取主键,若是其他数据库传入插入表主键字段max统计sql,在max统计的基础上加一
	 * 
	 * @param sqlName
	 * 
	 * @return
	 * 
	 * @throws IgdException
	 *  
	 * @throws SQLException 
	 */
	String generatePrimaryKey(String sqlName) throws SQLException, IgdException;
	
	/**
	 * 数据库删除方法
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param SQL执行参数
	 * 
	 * @throws SQLException 
	 * 
	 * @throws IgdException 
	 */
	void delete(String sqlName,Object param) throws SQLException, IgdException;
	
	/**
	 * 数据库保存方法
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param SQL执行参数
	 * 
	 * @throws SQLException
	 *  
	 * @throws IgdException 
	 */
	void save(String sqlName,Object param) throws SQLException, IgdException;
	
	/**
	 * 批量执行数据库操作方法
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param list 需要插入的数据对象集合
	 * 
	 * @param callBack 批处理执行后回调函数
	 * 
	 * @return Boolean 是否执行成功
	 * 
	 * @throws IgdException 
	 */
	boolean batchExecute(String sqlName,final List<?> list,final IbatisCallBack callBack) throws IgdException;
	
	/**
	 * 数据库更新方法
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param SQL执行参数
	 * 
	 * @throws SQLException 
	 * 
	 * @throws IgdException 
	 */
	void update(String sqlName,Object param) throws SQLException, IgdException;
	
	/**
	 * 数据库单条数据查询
	 * 
	 * @param <T>
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param 此param参数既作为SQL执行参数,也作为返回值类型
	 * 
	 * @return <T> T
	 * 
	 * @throws SQLException 
	 * 
	 * @throws IgdException 
	 */
	<T> T queryForObject(String sqlName,T param) throws SQLException, IgdException;
	
	/**
	 * 数据库单条数据查询
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param 此param参数仅作为SQL执行参数
	 * 
	 * @param resultType 此值为返回值类型
	 * 
	 * @return <T> T
	 * 
	 * @throws SQLException
	 * 
	 * @throws IgdException
	 */
	<T> T queryForObject(String sqlName,Object param,T resultType) throws SQLException, IgdException;
	
	/**
	 * 数据库多条数据查询
	 * 
	 * @param <T>
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param 此param参数既作为SQL执行参数,也作为返回值类型
	 * 
	 * @return <T> List<T>
	 * 
	 * @throws IgdException 
	 * 
	 * @throws SQLException 
	 */
	<T> List<T> queryForList(String sqlName,T param) throws SQLException, IgdException;
	
	/**
	 * 数据库多条数据查询
	 * 
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param param 此param参数仅作为SQL执行参数
	 * 
	 * @param resultType 此值为返回值类型
	 * 
	 * @return <T> List<T>
	 * 
	 * @throws SQLException
	 * 
	 * @throws IgdException
	 */
	<T> List<T> queryForList(String sqlName,Object param,T resultTye) throws SQLException, IgdException;
	
	/**
	 * @param sqlName 传入执行的ibatis对应的SQL名称
	 * 
	 * @param countSql 传入执行数据总数统计的ibatis对应的SQL名称
	 * 
	 * @param resultTye 此值为返回值类型
	 * 
	 * @param pageList 分页参数对象
	 * 
	 * @param resultTye 此值为返回值类型
	 * 
	 * @return	<T> List<T>
	 * 
	 * @throws SQLException
	 * 
	 * @throws IgdException
	 */
	<T> List<T> queryForListPage(String sqlName,String countSql,PageList pageList,T resultTye) throws SQLException, IgdException;
}
